<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   
      <title>3.7. Tratamiento de tipos de datos</title>
      <meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2">
      <link rel="home" href="indice.html" title="Manual Usuario gvHidra">
      <link rel="up" href="ch03.html" title="Cap&iacute;tulo 3. Elementos b&aacute;sicos">
      <link rel="prev" href="ch03s06.html" title="3.6. Personalizando el estilo">
      <link rel="next" href="ch03s08.html" title="3.8. Listas de datos sencillas">
   </head>
   <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
      <div class="navheader">
         <table width="100%" summary="Navigation header">
            <tr>
               <th colspan="3" align="center">3.7. Tratamiento de tipos de datos</th>
            </tr>
            <tr>
               <td width="20%" align="left"><a accesskey="p" href="ch03s06.html">Anterior</a>&nbsp;
               </td>
               <th width="60%" align="center">Cap&iacute;tulo 3. Elementos b&aacute;sicos</th>
               <td width="20%" align="right">&nbsp;<a accesskey="n" href="ch03s08.html">Siguiente</a></td>
            </tr>
         </table>
         <hr>
      </div>
      <div class="section" title="3.7. Tratamiento de tipos de datos">
         <div class="titlepage">
            <div>
               <div>
                  <h2 class="title" style="clear: both"><a name="d4e2609"></a>3.7. Tratamiento de tipos de datos
                  </h2>
               </div>
            </div>
         </div>
             
         
             
         <p>En un formulario podemos tener campos o columnas de varios tipos de
            componentes, entre otros campos de texto, combos, checkbox, etc que nos
            permiten ayudar al usurio a la hora de introducir informaci&oacute;n. Esto ayuda,
            pero no evita que en los campos de texto tengamos el riesgo de introducir
            valores inadecuados. Para estos casos, el framework permite definir un
            tipo y algunas caracter&iacute;sticas m&aacute;s de un campo facilitando algunas tareas
                b&aacute;sicas asociadas a estos (validaciones, m&aacute;scaras). Para asociar el tipo,
                debemos hacer uso del m&eacute;todo <span class="bold"><strong>addFieldType</strong></span>
                en la clase manejadora indicando el nombre del campo y la instancia del
                tipo a asociar.
         </p>
         
             
         <p>Una vez que hemos definido el tipo, tenemos que enlazarlo con el
                campo en la template con el par&aacute;metro <span class="bold"><strong>dataType</strong></span>.
         </p>
         
             
         <p>Ejemplo:</p>
         
             
         <div class="informalexample">
                  
            
                  <pre class="programlisting"># clase manejadora
$this-&gt;addFieldType('filTelefono', new gvHidraString(false, 15));

# template
{CWCampoTexto nombre="filTelefono" size="15" editable="true" textoAsociado="Tel&eacute;fono"
              <span class="bold"><strong>dataType=$dataType_nombreClaseManejadora.filTelefono</strong></span>}</pre>
                </div>
         
             
         <p>En la clase manejadora tambi&eacute;n disponemos de un m&eacute;todo para obtener
                la instancia del tipo asociada a un campo (<span class="bold"><strong>getFieldType</strong></span>)
         </p>
         
             
         <div class="section" title="3.7.1. Caracter&iacute;sticas generales">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e2621"></a>3.7.1. Caracter&iacute;sticas generales
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>El framework proporciona diferentes tipos de datos que permiten
                     controlar varios aspectos de interfaz y comportamientos. Concretamente,
                     al indicar el tipo de datos de un campo el framework nos ofrece:
            </p>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p>M&aacute;scaras de entrada seg&uacute;n tipo de datos en el cliente.</p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p>Validaciones en el servidor antes de operaciones de
                                  modificaci&oacute;n de los mismos en la BD (modificaci&oacute;n e
                                  inserci&oacute;n).
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p>Limitar la longitud m&aacute;xima del campo en pantalla,
                                  comprobaciones a nivel cliente (maxlength) y servidor
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p>Comprobaci&oacute;n de obligatoriedad a nivel de cliente y
                                  servidor.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p>Ordenaci&oacute;n en tabla por tipo de datos (sino se indica ordena
                                  siempre como cadena).
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p>Mostrar en pantalla caracter&iacute;sticas especiales seg&uacute;n tipo de
                                  datos.
                     </p>
                             
                  </li>
               </ul>
            </div>
            
                  
            <p>Los tipos de datos disponibles en gvHidra son:</p>
            
                  
            <div class="orderedlist">
               <ol class="orderedlist" type="1">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>gvHidraString</strong></span></p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>gvHidraDate</strong></span></p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>gvHidraDateTime</strong></span></p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>gvHidraInteger</strong></span></p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>gvHidraFloat</strong></span></p>
                             
                  </li>
               </ol>
            </div>
            
                  
            <p>Para hacer uso de los tipos, en la clase manejadora hay que crear
                     una instancia con el tipo que queramos, y luego asignarla al campo con
                     el m&eacute;todo <span class="bold"><strong>addTypeField()</strong></span> de la clase
                     manejadora. El constructor de los tipos de datos tiene por defecto dos
                     parametros
            </p>
            
                  
            <div class="orderedlist">
               <ol class="orderedlist" type="1">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>required:</strong></span> indica que el campo
                                  es obligatorio.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>maxLength:</strong></span> indica la longitud
                                  m&aacute;xima esperada. Las fechas no tienen este par&aacute;metro.
                     </p>
                             
                  </li>
               </ol>
            </div>
            
                  
            <p>Para informar al plugin (CWCampoTexto, CWAreaTexto, CWLista...) el
                     tipo de datos que va a contener, tenemos que utilizar la propiedad
                     <span class="bold"><strong>dataType</strong></span>. El framework insertar&aacute; los
                     datos en la variable
                     <span class="emphasis"><em>$dataType_claseManejadora.nombreCampo</em></span>.
            </p>
            
                  
            <p>Con esta definici&oacute;n de tipos conseguimos que el framework valide
                     los datos antes de cada operaci&oacute;n de modificaci&oacute;n de la BD
                     (actualizaci&oacute;n e inserci&oacute;n). Al detectar alg&uacute;n error, de forma
                     autom&aacute;tica, recoger&aacute; la informaci&oacute;n y la mostrar&aacute; en pantalla informando
                     al usuario.
            </p>
            
                  
            <div class="mediaobject" align="center"><img src="images/mensajeErroresValidacion.png" align="middle"></div>
                
         </div>
         
             
         <div class="section" title="3.7.2. Cadenas (gvHidraString)">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e2670"></a>3.7.2. Cadenas (gvHidraString)
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>Para el tratamiento de cadenas tenemos el tipo gvHidraString. Este
                     tipo tiene los siguientes m&eacute;todos propios:
            </p>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setRegExp(string)</strong></span>: Permite
                                  introducir una expresi&oacute;n regular para validar la cadena en el
                                  cliente (cuando el campo pierde el foco) como en el servidor.
                     </p>
                             
                  </li>
               </ul>
            </div>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setPasswordType(bool)</strong></span>:
                                  Permite crear un campo de tipo password, de forma que oculta el
                                  contenido del mismo a los ojos del usuario.
                     </p>
                             
                  </li>
               </ul>
            </div>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setInputMask(string)</strong></span>: Permite
                                  introducir una m&aacute;scara de entrada de datos para la cadena. El
                                  formato de m&aacute;scara ser&aacute;
                     </p>
                     
                               
                     <div class="itemizedlist">
                        <ul class="itemizedlist" type="circle">
                           <li class="listitem">
                                            
                              <p>'<span class="bold"><strong>#</strong></span>' Indica un car&aacute;cter
                                               num&eacute;rico.
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p>'<span class="bold"><strong>x</strong></span>' Indica una letra
                                               (may&uacute;scula o min&uacute;sculas)
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p>'<span class="bold"><strong>*</strong></span>' Indica un car&aacute;cter
                                               alfanum&eacute;rico (cualquier letra o n&uacute;mero)
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p>'<span class="bold"><strong>(</strong></span>', '<span class="bold"><strong>)</strong></span>', '<span class="bold"><strong>-</strong></span>',
                                               '<span class="bold"><strong>.</strong></span>', etc: Caracteres
                                               delimitadores t&iacute;picos
                              </p>
                                          
                           </li>
                        </ul>
                     </div>
                             
                  </li>
               </ul>
            </div>
            
                  
            <p>Vamos a ver algunos ejemplos para que quede m&aacute;s claro el uso de
                     las m&aacute;scaras:
            </p>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p><span class="emphasis"><em>M&aacute;scara</em></span>: (##) #######
                     </p>
                     
                               
                     <div class="itemizedlist">
                        <ul class="itemizedlist" type="circle">
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>Cadena</em></span>: 963333333
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>Resultado</em></span>: (96) 3333333
                              </p>
                                          
                           </li>
                        </ul>
                     </div>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="emphasis"><em>M&aacute;scara</em></span>: CP: #####
                     </p>
                     
                               
                     <div class="itemizedlist">
                        <ul class="itemizedlist" type="circle">
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>Cadena</em></span>: 46001
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>Resultado</em></span>: CP: 46001
                              </p>
                                          
                           </li>
                        </ul>
                     </div>
                             
                  </li>
               </ul>
            </div>
            
                  
            <p><span class="emphasis"><em>Nota: si no se hace uso de los m&eacute;todos los mismos est&aacute;n
                           deshabilitados.</em></span></p>
            
                  
            <p>En el siguiente fragmento de c&oacute;digo vemos como podemos asignar el
                     tipo gvHidraString a un campo.
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">$telefono = new gvHidraString(false, 15);
$telefono-&gt;setInputMask('(+##)-#########');
$this-&gt;addFieldType('filTelefono',$telefono);</pre>
                     </div>
            
                  
            <p>Primero se crea un objeto de tipo string llamando a la clase
                     gvHidraString, con el primer par&aacute;metro indicamos la obligatoriedad del
                     campo, y con el segundo el tama&ntilde;o m&aacute;ximo del campo. Ahora ya podemos
                     hacer uso del m&eacute;todo <span class="bold"><strong>setInputMask()</strong></span>,
                     que marcar&aacute; el campo con esa m&aacute;scara. Y por &uacute;ltimo se asigna el tipo al
                     campo en concreto, en nuestro caso es "filTelefono" (alias del campo en
                     la select de b&uacute;squeda o edici&oacute;n).
            </p>
                
         </div>
         
             
         <div class="section" title="3.7.3. Fechas">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e2730"></a>3.7.3. Fechas
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <div class="section" title="3.7.3.1. Entendiendo las fechas en gvHidra">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2732"></a>3.7.3.1. Entendiendo las fechas en gvHidra
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>La intenci&oacute;n de gvHidra es simplificar lo m&aacute;ximo posible los
                          problemas derivados de los formatos de las fechas, y para ello se
                          ofrece al programador una forma &uacute;nica de manejar las fechas (formato
                          de negocio) y es el framework el que se encarga, en caso necesario, de
                          convertir estas fechas al formato del usuario para interaccionar con
                          &eacute;ste (formato de usuario), o al formato que entiende nuestro gestor de
                          base de datos para almacenar/recuperar los datos (formato de
                          datos).
               </p>
               
                       
               <p>Actualmente gvHidra define de manera global el formato con el
                          que va a mostrar las fechas al usuario (m&eacute;todo <span class="bold"><strong>ConfigFramework::getDateMaskUser</strong></span>) y se puede
                          cambiar por el programador.
               </p>
               
                       
               <p>Tambi&eacute;n se define, por cada tipo de SGBD, cual es el formato que
                          reconocen (m&eacute;todo <span class="bold"><strong>mascaraFechas</strong></span> de
                          <span class="bold"><strong>IgepDBMS_*</strong></span>) aunque no se recomienda
                          modificarlos.
               </p>
               
                       
               <p>Por &uacute;ltimo, tambi&eacute;n se define el modo de representar las fechas
                          internamente (m&eacute;todo <span class="bold"><strong>ConfigFramework::getDateMaskFW</strong></span>), que es el que
                          nos permitir&aacute; operar en PHP con las fechas y que tampoco se recomienda
                          modificarlo.
               </p>
               
                       
               <p>En la siguiente figura podemos ver un esquema de la situaci&oacute;n
                          general:
               </p>
               
                       
               <div class="mediaobject" align="center"><img src="images/tr_fechas.jpg" align="middle"></div>
               
                       
               <p>Cada nodo representa uno de los tipos de formato explicados
                          antes, y las etiquetas junto a ellos representan el m&eacute;todo usado para
                          obtener la definici&oacute;n de ese formato. Las transiciones entre nodos
                          representan las conversiones que se realizan en el framework, y las
                          etiquetas junto a ellas representan los m&eacute;todos que convierten del
                          formato origen al destino de la transici&oacute;n. Adem&aacute;s los m&eacute;todos
                          marcados con * (y con color m&aacute;s claro) indican que el m&eacute;todo es
                          interno al framework, y por tanto el programador no necesitar&aacute; usarlo
                          normalmente. A pesar de ello se han incluido todos ellos en el esquema
                          para dar una visi&oacute;n completa.
               </p>
                     
            </div>
            
                  
            <div class="section" title="3.7.3.2. Uso en el framework">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2747"></a>3.7.3.2. Uso en el framework
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Primero, para incluir una fecha en un panel necesitamos:</p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p>Definir el campo en la select (b&uacute;squeda o edici&oacute;n).</p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>Definir el campo equivalente en la plantilla (tpl).</p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>Asociar un tipo de datos al campo de la plantilla (tpl) a
                                       trav&eacute;s del constructor de la clase manejadora. Usaremos las clases
                                       gvHidraDate o gvHidraDatetime dependiendo de si queremos la hora o
                                       no.
                        </p>
                                  
                     </li>
                  </ul>
               </div>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">// Fecha con calendario y etiqueta para el d&iacute;a de la semana en formato corto
// El par&aacute;metro indica "obligatoriedad" para cumplimentar el campo
$tipoFecha = new gvHidraDate(true);
// Existir&aacute; un calendario asociado al campo
$tipoFecha-&gt;setCalendar(true);
//Aparecer&aacute; la inicial del d&iacute;a de la semana (L, M, X, J, V, S, D)
tipoFecha-&gt;setDayOfWeek('short');
$this-&gt;addFieldType('fcertificacion', $tipoFecha);</pre>
                          </div>
               
                       
               <p>Cuando el programador accede a un campo declarado como fecha (en
                          un m&eacute;todo "pre" o "post", en una operaci&oacute;n o en una acci&oacute;n particular)
                          obtiene un objeto de la clase gvHidraTimestamp (basada en <a class="link" href=""></a><a class="ulink" href="http://php.net/manual/es/book.datetime.php" target="_top">DateTime</a><a class="link" href=""></a>)
                          (si no tiene valor se recibir&aacute; un NULL). No confundir esta clase con
                          las usadas para definir el tipo, &eacute;sta es la que se usa para operar con
                          las fechas (con o sin hora).
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$fpeticionIni = $objDatos-&gt;getValue('fpeticionIni');
if (empty($fpeticionIni))
   return;
// en $fpeticionIni tenemos una instancia de gvHidraTimestamp

// incrementar la fecha en 1 dia
$fpeticionIni-&gt;addDays(1);

// inicializar un campo a la fecha actual:
$objDatos-&gt;setValue('fcreacion', new gvHidraTimestamp());</pre>
                          </div>
               
                       
               <p>La clase gvHidraTimestamp nos ofrece algunos m&eacute;todos &uacute;tiles para
                          modificar u operar sobre las fechas:
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>__construct([$ts='now' [,
                                             $tz=null]])</strong></span>: el constructor tiene los mismos par&aacute;metros
                                       que DateTime; si no le pasamos ninguno se inicializa a la fecha y
                                       hora actual.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>setTime($hours, $minutes [, $seconds =
                                             0])</strong></span>: para modificar la hora.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>setDate($year, $month,
                                             $day)</strong></span>: para modificar la fecha.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>modify($str)</strong></span>: m&eacute;todo de
                                       DateTime que usa la sintaxis de strtotime para modificar la
                                       fecha.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>addDays(int), subDays(int)</strong></span>:
                                       a&ntilde;adir y restar dias a una fecha.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>addWeeks(int),
                                             subWeeks(int)</strong></span>: a&ntilde;adir y restar semanas a una
                                       fecha.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>addMonths(int), subMonths(int),
                                             addYears(int), subYears(int)</strong></span>: a&ntilde;adir y restar
                                       meses/a&ntilde;os a una fecha. Estos m&eacute;todos cambia el funcionamiento por
                                       defecto usado en modify: si estamos en dia 31 y le sumamos un mes,
                                       si no existe el dia obtenemos el 1 del mes siguiente. Con estos
                                       m&eacute;todos, en la situaci&oacute;n anterior obtenemos el &uacute;ltimo d&iacute;a del mes
                                       siguiente.
                        </p>
                                  
                     </li>
                  </ul>
               </div>
               
                       
               <p>Tambi&eacute;n hay m&eacute;todos para obtener la fecha en distintos formatos
                          o hacer comparaciones:
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>formatUser()</strong></span>: obtiene la
                                       fecha en el formato que ve el usuario. En principio no deber&iacute;a
                                       usarse por el programador.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>formatFW()</strong></span>: obtiene la
                                       fecha en el formato que reconoce el framework. En principio no
                                       deber&iacute;a usarse por el programador.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>formatSOAP()</strong></span>: obtiene la
                                       fecha en el formato usado en SOAP. Lo usaremos para generar fechas
                                       en servidores de web services.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>format($format)</strong></span>: m&eacute;todo de
                                       DateTime que acepta los formatos usados por date(). Este m&eacute;todo
                                       s&oacute;lo deberia usarse para obtener elementos de la fecha como el dia
                                       o el mes. Para otros formatos m&aacute;s complejos habr&iacute;a que valorar si
                                       se crea un nuevo m&eacute;todo en la clase.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>isLeap()</strong></span>: indica si el a&ntilde;o
                                       de la fecha es bisiesto.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>cmp($f1, $f2)</strong></span>: m&eacute;todo
                                       est&aacute;tico para comparar fechas. Devuelve 1 si la primera en menor,
                                       -1 si es mayor y 0 si son iguales. (OBSOLETO, ya que se puede
                                       comparar los objetos directamente).
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>between($f1, $f2)</strong></span>:
                                       comprueba si la fecha del objeto se encuentra entre el int&eacute;rvalo [
                                       f1, f2 ].
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>betweenDays($f1, $days)</strong></span>:
                                       comprueba si la fecha del objeto se encuentra entre el int&eacute;rvalo [
                                       f1, (f1 + days) ]. Si el n&uacute;mero de dias es negativo se usa el
                                       intervalo [(f1 + days), f1 ]
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>getTimestamp()</strong></span>: obtiene la
                                       fecha en timestamp. Este tipo tiene restricciones (en PHP &lt; 5.3
                                       el rango va de 1970 al 2036 aprox.), por lo que se recomienda no
                                       usar (casi todas las operaciones con timestamp se pueden hacer con
                                       DateTime).
                        </p>
                                  
                     </li>
                  </ul>
               </div>
                     
            </div>
            
                  
            <div class="section" title="3.7.3.3. gvHidraDate y gvHidraDatetime">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2816"></a>3.7.3.3. gvHidraDate y gvHidraDatetime
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Estas ser&iacute;an las clases usadas para indicar que el tipo de un
                          campo es una fecha, con la diferencia que la segunda admite tambi&eacute;n la
                          hora. Al definir un campo de este tipo, el framework ya se encarga de
                          hacer las transformaciones necesarias de formatos, asi como de aplicar
                          m&aacute;scaras y calendarios para la edici&oacute;n.
               </p>
               
                       
               <p>Estas clases tambi&eacute;n disponen de los siguientes m&eacute;todos
                          propios:
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p><span class="bold"><strong>setCalendar(bool)</strong></span>:
                                                    indica si se muestra o no el calendario.
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p><span class="bold"><strong>setDayOfWeek({none|short|long})</strong></span>: indica
                                                    si se quiere mostrar el dia de la semana.
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p><span class="bold"><strong>setDayOfYear(bool)</strong></span>:
                                                    indica si se quiere mostrar el d&iacute;a del a&ntilde;o.
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                                  
                     </li>
                  </ul>
               </div>
               
                       
               <p>Si no se hace uso de los m&eacute;todos los valores por defecto son
                          <span class="emphasis"><em>calendario=false, dayOfWeek=none,
                                dayOfYear=false.</em></span></p>
               
                       
               <p>Hay que tener precauci&oacute;n con no usar el tipo gvHidraDate si el
                          campo asociado tiene informaci&oacute;n de hora en la base de datos, ya que
                          el framework produciria una excepci&oacute;n. Este comportamiento se ha
                          definido de esta forma para evitar p&eacute;rdidas de datos por
                          truncamiento.
               </p>
               
                       
               <p><span class="emphasis"><em>Nota:</em></span> Hay que tener en cuenta que el tipo
                          gvHidraTimestamp (que hereda de DateTime de PHP) es una marca de
                          tiempo, con lo que vamos a trabajar con instantes de tiempo. En el
                          caso de operaciones con fechas, al crear instancias de dicha clase el
                          valor que coge por defecto es "now" (el instante de tiempo de la
                          invocaci&oacute;n); por lo que si se est&aacute; trabajando con fechas esto puede
                          acarrear errores. Para obtener la referencia al d&iacute;a actual se debe
                          invocar al constructor con el par&aacute;metro "today". A continuaci&oacute;n
                          mostramos unos ejemplos:
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">// Ejemplo, instante actual 24/07/2009 13:28:30

$f = new gvHidraTimestamp();
print($f-&gt;format("d/m/Y H:i:s")); // equivalente a $f-&gt;formatUser()
//Resultado = 24/07/2009 13:28:30

$f = new gvHidraTimestamp("today");
print($f-&gt;format("d/m/Y H:i:s"));
//Resultado = 24/07/2009 00:00:00

$f = new gvHidraTimestamp("yesterday");
print($f-&gt;format("d/m/Y H:i:s"));
//Resultado = 23/07/2009 00:00:00</pre>
                          </div>
                     
            </div>
            
                  
            <div class="section" title="3.7.3.4. Ejemplos">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2839"></a>3.7.3.4. Ejemplos
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Obtener informaci&oacute;n de una fecha:</p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$fpeticionIni = $objDatos-&gt;getValue('fpeticion');
if (is_null($fpeticionIni))
   return;
$day   = $fpeticionIni-&gt;format('d');
$month = $fpeticionIni-&gt;format('m');
$year  = $fpeticionIni-&gt;format('Y');</pre>
                          </div>
               
                       
               <p>Comparar fecha:</p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$fpeticionIni = $objDatos-&gt;getValue('fpeticion');
if (is_null($fpeticionIni))
   return;
// es fecha futura?
if (new gvHidraTimestamp("today") &lt; $fpeticionIni)</pre>
                          </div>
               
                       
               <p>Asignar una fecha cualquiera:</p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$f = new gvHidraTimestamp();
$f-&gt;setDate(1950,12,24);
$f-&gt;setTime(15,0,0);
$objDatos-&gt;setValue("fsolucion", $f);</pre>
                          </div>
               
                       
               <p>Modificar una fecha recibida:</p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$fpeticionIni = $objDatos-&gt;getValue('fpeticion');
if (is_null($fpeticionIni))
   return;
$fpeticionIni-&gt;subMonths(10);
$objDatos-&gt;setValue("fpeticion", $fpeticionIni);</pre>
                          </div>
               
                       
               <p>Obtener la diferencia en dias entre dos fechas:</p>
               
                       
               <div class="informalexample">
                              
                  
                              <pre class="programlisting">$diffDias = round(($fini-&gt;getTimestamp() - $ffin-&gt;getTimestamp()) / (24*60*60)) ; 
// a partir de PHP 5.3
$intervalo = $fini-&gt;diff($ffin); 
$diffDias = $intervalo-&gt;format('%a');</pre>
                            </div>
               
                       
               <p>Usar la fecha en una sentencia sql de la conexi&oacute;n
                          correspondiente:
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$fechabd = $this-&gt;getConnection()-&gt;prepararFecha($fpeticionIni);
$sentencia = "update facturas set fecha_entrada = '$fechabd' where usuario = 'xxx'";</pre>
                          </div>
               
                       
               <p>Obtener un objeto fecha de la base de datos de una consulta que
                          no hace el framework:
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$this-&gt;consultar("SELECT fecha,fechahora from tabla" ,
                 array( 'DATATYPES'=&gt;array('fecha'=&gt;TIPO_FECHA,'fechahora'=&gt;TIPO_FECHAHORA)));</pre>
                          </div>
                     
            </div>
                
         </div>
         
             
         <div class="section" title="3.7.4. N&uacute;meros">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e2863"></a>3.7.4. N&uacute;meros
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <div class="section" title="3.7.4.1. Entendiendo los n&uacute;meros en gvHidra">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2865"></a>3.7.4.1. Entendiendo los n&uacute;meros en gvHidra
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Cuando trabajamos con n&uacute;meros podemos encontramos con los mismos
                          problemas que hemos visto para las fechas, y que son los que vienen
                          derivados de los distintos formatos que pueden usarse para
                          representarlos.
               </p>
               
                       
               <p>En gvHIDRA se definen los formatos num&eacute;ricos indicando el
                          caracter usado como separador decimal, y el separador de miles (puede
                          ser cadena vacia). Al igual que en las fechas, tenemos:
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p>formato de interfaz, el usado para interactuar con el
                                       usuario, y que viene definido en m&eacute;todo <span class="bold"><strong>ConfigFramework::getNumericSeparatorsUser</strong></span>.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>formato de datos, definido para cada tipo de gestor de base
                                       de datos, en m&eacute;todos <span class="bold"><strong>caracteresNumericos</strong></span> de <span class="bold"><strong>IgepDBMS_*</strong></span>. Es el formato usado para las
                                       operaciones con las bases de datos de ese tipo.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p>formato del framework (o negocio), es el que el programador
                                       usa internamente para las operaciones, y se define en <span class="bold"><strong>ConfigFramework::getNumericSeparatorsFW</strong></span>.
                                       Este formato coincide con la representaci&oacute;n de n&uacute;meros interna en
                                       PHP, es decir, con punto decimal y sin separador de miles. Por
                                       tanto el programador puede manejar los n&uacute;meros directamente con
                                       los operadores y funciones propios de PHP.
                        </p>
                                  
                     </li>
                  </ul>
               </div>
               
                       
               <p>El framework se encarga de hacer las conversiones necesarias en
                          cada operaci&oacute;n. De los tres formatos definidos, solo el de la interfaz
                          es configurable por el programador.
               </p>
               
                       
               <p>En la siguiente figura podemos ver un esquema de la situaci&oacute;n,
                          siguiendo las mismas reglas explicadas anteriormente para las
                          fechas:
               </p>
               
                       
               <div class="mediaobject" align="center"><img src="images/tr_numeros.jpg" align="middle"></div>
                     
            </div>
            
                  
            <div class="section" title="3.7.4.2. gvHidraInteger y gvHidraFloat">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2885"></a>3.7.4.2. gvHidraInteger y gvHidraFloat
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>gvHidraInteger</strong></span>.
                        </p>
                        
                                    
                        <p>Usaremos este tipo para datos de tipo entero. No dispone de
                                       m&eacute;todos propios.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>gvHidraFloat</strong></span>.
                        </p>
                        
                                    
                        <p>Para datos de tipo num&eacute;rico con coma flotante. M&eacute;todos
                                       propios:
                        </p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p><span class="bold"><strong>setFloatLength(int)</strong></span>.
                                                    Permite fijar la longitud de la parte decimal del n&uacute;mero. De
                                                    este modo el n&uacute;mero se define a partir de su longitud total
                                                    m&aacute;s la de la parte decimal (siguiendo el patr&oacute;n de SQL). Si el
                                                    n&uacute;mero de decimales es 0, se recomienda usar
                                                    gvHidraInteger.
                                 </p>
                                 
                                                 
                                 <p><span class="emphasis"><em>Nota 1:</em></span> si no se hace uso del
                                                    m&eacute;todo setFloatLength el valor por defecto es 2.
                                 </p>
                                 
                                                 
                                 <p><span class="emphasis"><em>Nota 2</em></span>: Si no coincide el n&uacute;mero de
                                                    decimales en la BD con los que le indicamos al tipo se produce
                                                    una excepci&oacute;n, por lo que en caso necesario el programador
                                                    tiene que truncar/redondear los datos seg&uacute;n sus
                                                    necesidades.
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                                  
                     </li>
                  </ul>
               </div>
                     
            </div>
            
                  
            <div class="section" title="3.7.4.3. Uso en el framework">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2904"></a>3.7.4.3. Uso en el framework
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>En el constructor de la clase manejadora del panel hay que crear
                          el tipo para poder asign&aacute;rselo al campo que corresponda, as&iacute; como
                          marcar las propiedades/caracter&iacute;sticas.
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">// numero con 8 digitos en la parte entera y 2 decimales
$tipoNumeroDec =  new gvHidraFloat(false, 10);
// numero con 7 digitos en la parte entera y 3 decimales
$tipoNumeroDec-&gt;setFloatLength(3);
$this-&gt;addFieldType('ediCoste', $tipoNumeroDec);</pre>
                          </div>
               
                       
               <p>Primero se crea un objeto de tipo float llamando a la clase
                          gvHidraFloat, con el primer par&aacute;metro indicamos la obligatoriedad del
                          campo, y con el segundo el tama&ntilde;o m&aacute;ximo del campo, incluidos los
                          decimales. Ahora ya podemos hacer uso del m&eacute;todo <span class="bold"><strong>setFloatLength()</strong></span>. Y por &uacute;ltimo se asigna el
                          tipo al campo en concreto, en nuestro caso es "ediCoste" (alias del
                          campo en la select de b&uacute;squeda o edici&oacute;n).
               </p>
               
                       
               <p>De esta forma, gvHidra se encarga de realizar las conversiones
                          necesarias para comunicarse con la BD y el usuario no necesita
                          preocuparse por si debe introducir como separador de decimales la coma
                          o el punto. Los separadores de miles aparecen "solos" y el separador
                          decimal aparece con la coma o el punto del teclado num&eacute;rico. Cualquier
                          otro caracter (letras, par&eacute;ntesis, etc...) no pueden introducirse, se
                          ignoran.
               </p>
               
                       
               <p>Si trabajando en la capa de negocio queremos asignar
                          expl&iacute;citamente un n&uacute;mero para mostrarlo en pantalla, lo podemos hacer
                          directamente con el metodo <span class="bold"><strong>setValue()</strong></span>
                          del objeto datos usando un numero en PHP. Si lo que queremos es coger
                          un n&uacute;mero (getValue del objeto datos), operar con &eacute;l y asignarlo,
                          tambi&eacute;n lo podemos hacer directamente. Si tras operar con &eacute;l queremos
                          hacer algo con la base de datos, usaremos el m&eacute;todo prepararNumero de
                          la conexi&oacute;n correspondiente:
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$costebd = $this-&gt;getConnection()-&gt;prepararNumero($coste);
$sentencia = "update facturas set importe = $costebd where factura = 10";</pre>
                          </div>
                     
            </div>
                
         </div>
         
             
         <div class="section" title="3.7.5. Creaci&oacute;n de nuevos tipos de datos">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e2916"></a>3.7.5. Creaci&oacute;n de nuevos tipos de datos
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>Puede ser interesante que, para ciertos casos puntuales, se
                     requiera crear un tipo de datos concreto que nos garantice que los datos
                     son correctos. El framework realizar&aacute; las validaciones por nosotros y
                     nos garantizar&aacute; que el dato es v&aacute;lido. Para ello debemos crear una clase
                     dentro de nuestra aplicaci&oacute;n o custom que sea accesible. Esta clase debe
                     heredar de uno de los tipos b&aacute;sicos de gvHidra o del tipo b&aacute;sico
                     (gvHidraTypeBase) si s&oacute;lo se quieren heredar las caracter&iacute;sticas
                     b&aacute;sicas. Esta clase debe implementar la interfaz gvHidraType. Esto
                     supone que el programador de la clase deber&aacute; implementar el m&eacute;todo
                     validate(). A continuaci&oacute;n tenemos un ejemplo:
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">//Type que controla que el campo introducido corresponde con el a&ntilde;o actual
class anyoActual extends gvHidraTypeBase implements gvHidraType
{
    public function __construct($required=false)
    {
        $maxLength = 4;
        parent::__construct($required,$maxLength);
    }//Fin de constructor

    public function validate($value)
    {
        if($value!=date('Y'))
           throw new Exception('No ha introducido el a&ntilde;o actual.');
    }
 
}</pre>
                     </div>
                
         </div>
           
      </div>
      <div class="navfooter">
         <hr>
         <table width="100%" summary="Navigation footer">
            <tr>
               <td width="40%" align="left"><a accesskey="p" href="ch03s06.html">Anterior</a>&nbsp;
               </td>
               <td width="20%" align="center"><a accesskey="u" href="ch03.html">Subir</a></td>
               <td width="40%" align="right">&nbsp;<a accesskey="n" href="ch03s08.html">Siguiente</a></td>
            </tr>
            <tr>
               <td width="40%" align="left" valign="top">3.6. Personalizando el estilo&nbsp;</td>
               <td width="20%" align="center"><a accesskey="h" href="indice.html">Inicio</a></td>
               <td width="40%" align="right" valign="top">&nbsp;3.8. Listas de datos sencillas</td>
            </tr>
         </table>
      </div>
   </body>
</html>